热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

加多|底线_Python的线程14有界信号量,这是一个有底线的信号量

篇首语:本文由编程笔记#小编为大家整理,主要介绍了Python的线程14有界信号量,这是一个有底线的信号量相关的知识,希望对你有一定的参考价值。

篇首语:本文由编程笔记#小编为大家整理,主要介绍了Python的线程14 有界信号量,这是一个有底线的信号量相关的知识,希望对你有一定的参考价值。




正式的Python专栏第51篇,同学站住,别错过这个从0开始的文章!


前篇学委提出了Semaphore信号量来制作限流器的思路和一个简单的限流器实现。

代码运行起来了,看起来没有错误。

不过,细心的读者会发现,如果我们出现像下面的信号量使用方式:

xuewei_semaphore.acquire() #获取信号量
//do something
....
xuewei_semaphore.release() #释放信号量
#>>> xuewei_semaphore.release() #如果这里再调用一次release呢?

也就是 Semaphore 进行的释放的操作,比获取的还多一点点,会不会出问题?

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time : 2021/11/27 10:43 下午
# @Author : LeiXueWei
# @CSDN/Juejin/Wechat: 雷学委
# @XueWeiTag: CodingDemo
# @File : thread_semaphore_boundvs_unbound.py
# @Project : hello
import threading
import time
xuewei_semaphore = threading.Semaphore(1) #后面改成有界信号量
print("xuewei_semaphore:", xuewei_semaphore)
def run():
print(" %s ready" % threading.current_thread().name)
xuewei_semaphore.acquire()
print(" %s go" % threading.current_thread().name)
time.sleep(0.1)
print(" %s completed" % threading.current_thread().name)
xuewei_semaphore.release()
def abnormal_run():
run()
xuewei_semaphore.release() # 多release了一次
t = threading.Thread(name="正常使用信号量", target=run)
t.start()
time.sleep(1)
t = threading.Thread(name="非正常使用信号量", target=abnormal_run)
t.start()

上面学委结合了第一篇分享信号量的文章, 简化了一下,重点展示多释放信号量的效果。

我们发现程序没有任何报错:

如果我们把反常的使用增加调用呢,比如下面的代码:

#在上方代码后面加上下面这段代码
for i in range(10000):
t = threading.Thread(name="非正常使用信号量"+str(i), target=abnormal_run)
t.start()

全程没有报错!!!

我直接震惊了!Python容错率太高了(这是高情商的说法,😂)


有界信号量 走过来把这个坑填上了

threading.BoundedSemaphore 这个类就是有界信号量,英文名非常直观了。

什么是有界?

跟做人一样,守住底线。那么Semaphore的底线在哪里?我们可以点击这个类去看一部分代码。

Semaphore维护了一个_value, 有界的信号量其实就是加多了一个变量_initial_value,去记录了信号量初始值。

后续,我们调用release函数的时候,有界信号量,每次都会检查,_value是否越界了(就是一旦超过了_initial_value,就抛出一个ValueError,提示越界了!)

这个太友好了.

下面就使用有界信号量展示,对比第一段代码,仅仅把

xuewei_semaphore = threading.Semaphore(1)

改为了:

xuewei_semaphore = threading.BoundedSemaphore(1)

所以读者可以直接改,当然也可以选择直接复制下面的代码再存一个文件运行。

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time : 2021/11/27 10:43 下午
# @Author : LeiXueWei
# @CSDN/Juejin/Wechat: 雷学委
# @XueWeiTag: CodingDemo
# @File : thread_semaphore_boundvs_unbound3.py
# @Project : hello
import threading
import time
xuewei_semaphore = threading.BoundedSemaphore(1)
print("xuewei_semaphore:", xuewei_semaphore)
def run():
print(" %s ready" % threading.current_thread().name)
xuewei_semaphore.acquire()
print(" %s go" % threading.current_thread().name)
time.sleep(0.1)
print(" %s completed" % threading.current_thread().name)
xuewei_semaphore.release()
def abnormal_run():
run()
xuewei_semaphore.release() # 多release了一次
t = threading.Thread(name="正常使用信号量", target=run)
t.start()
time.sleep(1)
t = threading.Thread(name="非正常使用信号量", target=abnormal_run)
t.start()

使用有界之后,果然,过度释放,系统就报错了!终于放心了。


总结

大家应该尽量使用有界信号量,它能帮我们守住边界。它不会因为我们不小心写错程序,写多一次release而放任程序继续正常运行。(可能是熬夜写代码,建议不要!写代码需要一个舒适的状态,质量更高)

如果使用纯Semaphore,那请务必封装起来(成对调用封闭起来)不对外开放acquire和release的使用,这样才能安装。

喜欢Python的朋友,请关注学委的 Python基础专栏 or Python入门到精通大专栏



持续学习持续开发,我是雷学委!
编程很有趣,关键是把技术搞透彻讲明白。
欢迎关注微信,点赞支持收藏!



推荐阅读
  • 本文整理了315道Python基础题目及答案,帮助读者检验学习成果。文章介绍了学习Python的途径、Python与其他编程语言的对比、解释型和编译型编程语言的简述、Python解释器的种类和特点、位和字节的关系、以及至少5个PEP8规范。对于想要检验自己学习成果的读者,这些题目将是一个不错的选择。请注意,答案在视频中,本文不提供答案。 ... [详细]
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • 树莓派语音控制的配置方法和步骤
    本文介绍了在树莓派上实现语音控制的配置方法和步骤。首先感谢博主Eoman的帮助,文章参考了他的内容。树莓派的配置需要通过sudo raspi-config进行,然后使用Eoman的控制方法,即安装wiringPi库并编写控制引脚的脚本。具体的安装步骤和脚本编写方法在文章中详细介绍。 ... [详细]
  • EzPP 0.2发布,新增YAML布局渲染功能
    EzPP发布了0.2.1版本,新增了YAML布局渲染功能,可以将YAML文件渲染为图片,并且可以复用YAML作为模版,通过传递不同参数生成不同的图片。这个功能可以用于绘制Logo、封面或其他图片,让用户不需要安装或卸载Photoshop。文章还提供了一个入门例子,介绍了使用ezpp的基本渲染方法,以及如何使用canvas、text类元素、自定义字体等。 ... [详细]
  • 2016 linux发行版排行_灵越7590 安装 linux (manjarognome)
    RT之前做了一次灵越7590黑苹果炒作业的文章,希望能够分享给更多不想折腾的人。kawauso:教你如何给灵越7590黑苹果抄作业​zhuanlan.z ... [详细]
  • 超级简单加解密工具的方案和功能
    本文介绍了一个超级简单的加解密工具的方案和功能。该工具可以读取文件头,并根据特定长度进行加密,加密后将加密部分写入源文件。同时,该工具也支持解密操作。加密和解密过程是可逆的。本文还提到了一些相关的功能和使用方法,并给出了Python代码示例。 ... [详细]
  • 校园表白墙微信小程序,校园小情书、告白墙、论坛,大学表白墙搭建教程
    小程序的名字必须和你微信注册的名称一模一样在后台注册好小程序。mp.wx-union.cn后台域名https。mp.wx-union.cn ... [详细]
  • YOLOv7基于自己的数据集从零构建模型完整训练、推理计算超详细教程
    本文介绍了关于人工智能、神经网络和深度学习的知识点,并提供了YOLOv7基于自己的数据集从零构建模型完整训练、推理计算的详细教程。文章还提到了郑州最低生活保障的话题。对于从事目标检测任务的人来说,YOLO是一个熟悉的模型。文章还提到了yolov4和yolov6的相关内容,以及选择模型的优化思路。 ... [详细]
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • Echarts图表重复加载、axis重复多次请求问题解决记录
    文章目录1.需求描述2.问题描述正常状态:问题状态:3.解决方法1.需求描述使用Echats实现了一个中国地图:通过选择查询周期&#x ... [详细]
  • Oracle分析函数first_value()和last_value()的用法及原理
    本文介绍了Oracle分析函数first_value()和last_value()的用法和原理,以及在查询销售记录日期和部门中的应用。通过示例和解释,详细说明了first_value()和last_value()的功能和不同之处。同时,对于last_value()的结果出现不一样的情况进行了解释,并提供了理解last_value()默认统计范围的方法。该文对于使用Oracle分析函数的开发人员和数据库管理员具有参考价值。 ... [详细]
  • sklearn数据集库中的常用数据集类型介绍
    本文介绍了sklearn数据集库中常用的数据集类型,包括玩具数据集和样本生成器。其中详细介绍了波士顿房价数据集,包含了波士顿506处房屋的13种不同特征以及房屋价格,适用于回归任务。 ... [详细]
  • 开发笔记:Java是如何读取和写入浏览器Cookies的
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了Java是如何读取和写入浏览器Cookies的相关的知识,希望对你有一定的参考价值。首先我 ... [详细]
  • MyBatis多表查询与动态SQL使用
    本文介绍了MyBatis多表查询与动态SQL的使用方法,包括一对一查询和一对多查询。同时还介绍了动态SQL的使用,包括if标签、trim标签、where标签、set标签和foreach标签的用法。文章还提供了相关的配置信息和示例代码。 ... [详细]
  • web.py开发web 第八章 Formalchemy 服务端验证方法
    本文介绍了在web.py开发中使用Formalchemy进行服务端表单数据验证的方法。以User表单为例,详细说明了对各字段的验证要求,包括必填、长度限制、唯一性等。同时介绍了如何自定义验证方法来实现验证唯一性和两个密码是否相等的功能。该文提供了相关代码示例。 ... [详细]
author-avatar
残念易_138
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有